package br.com.saeng2D.objeto.forca;

import java.awt.Graphics2D;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import br.com.saeng2D.objeto.AbstratoObjeto;
import br.com.saeng2D.objeto.animado.Associacao;
import br.com.saeng2D.objeto.animado.VetorAnimado;
import br.com.saeng2D.objeto.linha.Linha;
import br.com.saeng2D.objeto.ponto.Ponto;
import br.com.saeng2D.util.Util;
import br.com.saeng2D.util.Vetor;

public class ForcaCentralizada2 extends AbstratoForca {
	private Vetor vetor;
	
	public ForcaCentralizada2(Vetor vetor, int x, int y) {
		super("forca_centralizada", x, y);
		this.vetor = vetor;
		inicializacao();
		this.corFundo = Util.getCor("cor_forca_centralizada");
	}

	public void inicializacao() {
		vetores = new VetorAnimado[4];

//		int comprimento = (int) vetor.getComprimento();
		
		vetores[0] = new VetorAnimado(vetor.clonar(),  false, false);
		vetores[1] = new VetorAnimado(vetor.clonar(),  false, true);
		vetores[2] = new VetorAnimado(vetor.clonar(),  false, false);
		vetores[3] = new VetorAnimado(vetor.clonar(),  false, false);

		vetores[0].alterarTamanho(12);
		vetores[2].alterarTamanho(12);
		vetores[3].alterarTamanho(5);
		
		vetores[0].rotacionar(35);
		vetores[2].rotacionar(-35);
		        
		vetorReferencia = vetores[1];

		associacoes = new Associacao[3];
		associacoes[0] = new Associacao(vetores[0], vetores[3]);
		associacoes[1] = new Associacao(vetores[2], vetores[3]);
		associacoes[2] = new Associacao(vetores[3], vetores[1]);
	}

	public void reassociar() {
		vetorReferencia = vetores[1];

		associacoes = new Associacao[3];
		associacoes[0] = new Associacao(vetores[0], vetores[3]);
		associacoes[1] = new Associacao(vetores[2], vetores[3]);
		associacoes[2] = new Associacao(vetores[3], vetores[1]);
	}
	
	public void rotacionar(int grau) {
		super.rotacionar(grau);
		this.grau = grau;
	}
	
	public AbstratoObjeto prototipo() {
		ForcaCentralizada2 forca = new ForcaCentralizada2(vetor, x, y);
		forca.vetores = vetores;
		forca.associacoes = associacoes;
		forca.vetorReferencia = vetorReferencia;
		forca.variavelForca = variavelForca;
		return forca;
	}
	
	public void salvarXML(String prefixo, PrintWriter pw) {
		pw.print(prefixo + "\t<" + descricao + " x=\"" + x + "\" y=\"" + y + "\" q=\"" + vetores.length + "\" vetores=\"" + vetores() + "\" grau=\"" + grau + "\" stringValorNewton=\"" + variavelForca + "\"/>\r\n");
	}
	
	public final void restaurar(int q, String stringVetores, int grau, String stringValorNewton) {
		vetores = new VetorAnimado[q];
		String[] strings = stringVetores.split("@");
		int i = 0;
		for(String s : strings) {
			String[] sv = s.split(";");
			float x = Float.parseFloat(sv[0]);
			float y = Float.parseFloat(sv[1]);
			boolean visivel = Boolean.parseBoolean(sv[2]);
			boolean referencia = Boolean.parseBoolean(sv[3]);
			vetores[i] = new VetorAnimado(x, y, visivel, referencia);
			i++;
		}
		reassociar();
		this.grau = grau;
		this.variavelForca = stringValorNewton;
	}
	
	public void desenhar(Graphics2D g2) {
		if(!isVisivel()) {
			return;
		}
		g2.setStroke(AbstratoObjeto.LARGURA_LINHA_ABSTRATO_OBJETO);
		if (selecionado) {
			g2.setColor(corSelecionado);
		} else {
			g2.setColor(corFundo);
		}
		for(VetorAnimado v : vetores) {
			if(v.visivel) {
				desenhar(g2, v);
			}
		}
		for(Associacao a : associacoes) {
			desenhar(g2, a);
		}
//		int x = (int) vetores[4].x;
//		int y = (int) vetores[4].y;
//		int dx = grau == 180 ? 10 : 0; 
//		int dy = grau == 270 ? -10 : 0; 
//		g2.drawString(stringValorNewton, this.x + x + dx, this.y + y * -1 + dy);
		if(variavelForca != null) {
			g2.setColor(corVariavelForca);
			g2.drawString(variavelForca, x, y);
		}
	}
	
	public int getGrau() {
		return grau;
	}

	public void setGrau(int grau) {
		this.grau = grau;
	}

	public void alterarTamanho(int tamanho) {
		throw new RuntimeException();
	}

	public boolean estarSob(int x, int y) {
		Ponto ponto1 = new Ponto(this.x, this.y);
		Vetor vetor = vetorReferencia;
		Ponto ponto2 = new Ponto((int)(this.x + vetor.x), (int)(this.y + vetor.y * -1));
		Linha linha = new Linha(ponto1, ponto2);
		return linha.estarSob(x, y);
	}

	public boolean ehIgual(AbstratoObjeto objeto) {
		// TODO implementar
		return false;
	}

	public boolean estaNaHorizontal() {
		Ponto ponto1 = new Ponto(this.x, this.y);
		Vetor vetor = vetorReferencia;
		Ponto ponto2 = new Ponto((int)(this.x + vetor.x), (int)(this.y + vetor.y * -1));
		if(ponto1.getX()<ponto2.getX()){
			sentidoPosOuNeg = true;			
		}else{
			sentidoPosOuNeg = false;
		}
		return ponto1.ehIgualY(ponto2);
	}
	public boolean estaNaVertical() {
		Ponto ponto1 = new Ponto(this.x, this.y);
		Vetor vetor = vetorReferencia;
		Ponto ponto2 = new Ponto((int)(this.x + vetor.x*-1), (int)(this.y + vetor.y));
		if(ponto1.getY()<ponto2.getY()){
			sentidoPosOuNeg = false;			
		}else{
			sentidoPosOuNeg = true;
		}
		return ponto1.ehIgualX(ponto2);
	}

	public boolean estaNaDiagonal(){
		Ponto ponto1 = new Ponto(this.x, this.y);
		Vetor vetor = vetorReferencia;
		Ponto ponto2 = new Ponto(this.x, this.y);
		
		ponto2 = new Ponto((int)(this.x - vetor.x), (int)(this.y - vetor.y));
		
		int x0 = this.x;
		int y0 = this.y;
		float x1 = vetor.x;
		float y1 = vetor.y;
		

		
		if((int)(x0-x1)<x0){
			if((int)(y0-y1)<y0){

			}else{

			}
		}else{
			if((int)(y0-y1)<y0){

			}else{

			}
		}
		
		return ponto1.ehIgualX(ponto2);
	}
	public List<ForcaCentralizada> forcaNaDiagonal(double grauInclinacao,String variavelForca){
		ForcaCentralizada forca1 = new ForcaCentralizada(this.x, this.y);
		ForcaCentralizada forca2 = new ForcaCentralizada(this.x, this.y);
		List<ForcaCentralizada> forcasEquivalentes = new ArrayList<ForcaCentralizada>();
		Vetor vetor = vetorReferencia;
			
		forca1.setOrientacao(true);
		forca2.setOrientacao(false);
		
		
		if(vetor.x<0){
			if(vetor.y>0){
				forca1.setSentidoPosOuNeg(false);
				forca1.setVariavelForca(java.lang.String.format("%.2f", Math.sin(Math.toRadians(90.0)-Math.toRadians(grauInclinacao)) * Double.parseDouble(variavelForca)));
				forca2.setSentidoPosOuNeg(false);
				forca2.setVariavelForca(java.lang.String.format("%.2f", Math.cos(Math.toRadians(90.0)-Math.toRadians(grauInclinacao)) * Double.parseDouble(variavelForca)));
			}else if(vetor.y<0){
				forca1.setSentidoPosOuNeg(true);
				forca1.setVariavelForca(java.lang.String.format("%.2f", Math.sin(Math.toRadians(90.0)+Math.toRadians(grauInclinacao)) * Double.parseDouble(variavelForca)));
				forca2.setSentidoPosOuNeg(false);
				forca2.setVariavelForca(java.lang.String.format("%.2f", Math.cos(Math.toRadians(90.0)+Math.toRadians(grauInclinacao)) * Double.parseDouble(variavelForca)));
			}
		}else if(vetor.x>0){
			if(vetor.y>0){
				forca1.setSentidoPosOuNeg(false);
				forca1.setVariavelForca(java.lang.String.format("%.2f", Math.sin(Math.toRadians(90.0)+Math.toRadians(grauInclinacao)) * Double.parseDouble(variavelForca)));
				forca2.setSentidoPosOuNeg(true);
				forca2.setVariavelForca(java.lang.String.format("%.2f", Math.cos(Math.toRadians(90.0)+Math.toRadians(grauInclinacao)) * Double.parseDouble(variavelForca)));
			}else if(vetor.y<0){
				forca1.setSentidoPosOuNeg(true);
				forca1.setVariavelForca(java.lang.String.format("%.2f", Math.sin(Math.toRadians(90.0)-Math.toRadians(grauInclinacao)) * Double.parseDouble(variavelForca)));
				forca2.setSentidoPosOuNeg(true);
				forca2.setVariavelForca(java.lang.String.format("%.2f", Math.cos(Math.toRadians(90.0)-Math.toRadians(grauInclinacao)) * Double.parseDouble(variavelForca)));
			}
		}
		
		forcasEquivalentes.add(forca1);
		forcasEquivalentes.add(forca2);
		

		return forcasEquivalentes;	
	}
	
}